package ru.zombator.taskman.dbadmin.actions;

import java.lang.reflect.InvocationTargetException;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.IStructuredSelection;

import ru.zombator.taskman.core.dbclient.DbException;
import ru.zombator.taskman.core.domain.IPerson;
import ru.zombator.taskman.dbadmin.AdminApp;
import ru.zombator.taskman.dbadmin.ImageNames;

public class DeleteUserAction extends ASimpleAction {
	private static final String ACTION_ID = "ru.zombator.taskman.dbadmin.deleteUser";

	@Override
	public String getId() {
		return ACTION_ID;
	}

	public DeleteUserAction(AdminApp mainApp) {
		super(mainApp);
	}

	@Override
	protected String getImageName() {
		return ImageNames.DELETE_USER;
	}

	@Override
	public String getText() {
		return "Удалить";
	}

	@Override
	public void run() {
		final IStructuredSelection sel = (IStructuredSelection) mainApp
				.getUsersTable().getSelection();

		if (!MessageDialog.openQuestion(mainApp.getShell(), "Удаление "
				+ (sel.size() == 1 ? "пользователя" : "пользователей"),
				"Удалить "
						+ (sel.size() == 1 ? "пользователя "
								+ ((IPerson) sel.getFirstElement()).getName()
								: "выделенных пользователей") + "?"))
			return;

		final StringBuilder notDeletedUsers = new StringBuilder();
		try {
			new ProgressMonitorDialog(mainApp.getShell()).run(true, false,
					new IRunnableWithProgress() {
						@Override
						public void run(IProgressMonitor monitor)
								throws InvocationTargetException,
								InterruptedException {
							SubMonitor sub = SubMonitor.convert(monitor, sel
									.size());
							try {
								for (Object usrObject : sel.toList()) {
									try {
										mainApp.getClient().dropUser(
												(IPerson) usrObject);
										mainApp.getLocalUserList().remove(
												usrObject);
									} catch (DbException e) {
										notDeletedUsers
												.append(((IPerson) usrObject)
														.getName());
									} finally {
										sub.worked(1);
									}
								}
							} finally {
								if (sub != null)
									sub.done();
							}

							if (notDeletedUsers.length() > 0) {
								notDeletedUsers.setLength(notDeletedUsers
										.length() - 1);
								throw new InvocationTargetException(
										new DbException(
												"Не удалось удалить пользователей:\n"
														+ notDeletedUsers
																.toString()));
							}
						}
					});
			mainApp.getUsersTable().setInput(mainApp.getLocalUserList());
		} catch (InvocationTargetException e) {
			MessageDialog.openError(mainApp.getShell(), "Ошибка", (e.getCause()
					.getMessage() != null ? e.getCause().getMessage()
					: "Не удалось удалить выделенных пользователей."));
		} catch (InterruptedException e) {
			// выполнение было отменено, что невозможно
			// (мы поставили флаг cancelable=false)
		}
	}

	@Override
	public boolean isEnabled() {
		return !mainApp.getUsersTable().getSelection().isEmpty();
	}
}